home *** CD-ROM | disk | FTP | other *** search
- package javax.swing.text;
-
- import java.awt.Color;
- import java.awt.Component;
- import java.awt.Container;
- import java.awt.Font;
- import java.awt.FontMetrics;
- import java.awt.Graphics;
- import java.awt.Rectangle;
- import java.awt.Shape;
- import javax.swing.event.DocumentEvent;
- import javax.swing.event.DocumentEvent.EventType;
- import javax.swing.text.Position.Bias;
-
- public class PlainView extends View implements TabExpander {
- protected FontMetrics metrics;
- Element longLine;
- Font font;
- Segment lineBuffer = new Segment();
- int tabSize;
- int tabBase;
- int sel0;
- int sel1;
- Color unselected;
- Color selected;
-
- public PlainView(Element var1) {
- super(var1);
- }
-
- Shape adjustPaintRegion(Shape var1) {
- return var1;
- }
-
- private void calculateLongestLine() {
- Container var1 = ((View)this).getContainer();
- this.font = ((Component)var1).getFont();
- this.metrics = ((Component)var1).getFontMetrics(this.font);
- Document var2 = ((View)this).getDocument();
- Element var3 = ((View)this).getElement();
- int var4 = var3.getElementCount();
- int var5 = -1;
-
- for(int var6 = 0; var6 < var4; ++var6) {
- Element var7 = var3.getElement(var6);
- int var8 = this.getLineWidth(var7);
- if (var8 > var5) {
- var5 = var8;
- this.longLine = var7;
- }
- }
-
- }
-
- public void changedUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
- this.updateDamage(var1, var2, var3);
- }
-
- private void damageLineRange(int var1, int var2, Shape var3, Component var4) {
- if (var3 != null) {
- Rectangle var5 = this.lineToRect(var3, var1);
- Rectangle var6 = this.lineToRect(var3, var2);
- if (var5 != null && var6 != null) {
- Rectangle var7 = var5.union(var6);
- var4.repaint(var7.x, var7.y, var7.width, var7.height);
- } else {
- var4.repaint();
- }
- }
-
- }
-
- private int drawElement(Element var1, Graphics var2, int var3, int var4) throws BadLocationException {
- int var5 = var1.getStartOffset();
- int var6 = var1.getEndOffset();
- var6 = Math.min(((View)this).getDocument().getLength(), var6);
- AttributeSet var7 = var1.getAttributes();
- if (Utilities.isComposedTextAttributeDefined(var7)) {
- var2.setColor(this.unselected);
- var3 = Utilities.drawComposedText(var7, var2, var3, var4, var5 - var1.getStartOffset(), var6 - var1.getStartOffset());
- } else if (this.sel0 == this.sel1) {
- var3 = this.drawUnselectedText(var2, var3, var4, var5, var6);
- } else if (var5 >= this.sel0 && var5 <= this.sel1 && var6 >= this.sel0 && var6 <= this.sel1) {
- var3 = this.drawSelectedText(var2, var3, var4, var5, var6);
- } else if (this.sel0 >= var5 && this.sel0 <= var6) {
- if (this.sel1 >= var5 && this.sel1 <= var6) {
- var3 = this.drawUnselectedText(var2, var3, var4, var5, this.sel0);
- var3 = this.drawSelectedText(var2, var3, var4, this.sel0, this.sel1);
- var3 = this.drawUnselectedText(var2, var3, var4, this.sel1, var6);
- } else {
- var3 = this.drawUnselectedText(var2, var3, var4, var5, this.sel0);
- var3 = this.drawSelectedText(var2, var3, var4, this.sel0, var6);
- }
- } else if (this.sel1 >= var5 && this.sel1 <= var6) {
- var3 = this.drawSelectedText(var2, var3, var4, var5, this.sel1);
- var3 = this.drawUnselectedText(var2, var3, var4, this.sel1, var6);
- } else {
- var3 = this.drawUnselectedText(var2, var3, var4, var5, var6);
- }
-
- return var3;
- }
-
- protected void drawLine(int var1, Graphics var2, int var3, int var4) {
- Element var5 = ((View)this).getElement().getElement(var1);
-
- try {
- if (var5.isLeaf()) {
- this.drawElement(var5, var2, var3, var4);
- } else {
- int var7 = var5.getElementCount();
-
- for(int var8 = 0; var8 < var7; ++var8) {
- Element var6 = var5.getElement(var8);
- var3 = this.drawElement(var6, var2, var3, var4);
- }
- }
-
- } catch (BadLocationException var9) {
- throw new StateInvariantError("Can't render line: " + var1);
- }
- }
-
- protected int drawSelectedText(Graphics var1, int var2, int var3, int var4, int var5) throws BadLocationException {
- var1.setColor(this.selected);
- Document var6 = ((View)this).getDocument();
- var6.getText(var4, var5 - var4, this.lineBuffer);
- return Utilities.drawTabbedText(this.lineBuffer, var2, var3, var1, this, var4);
- }
-
- protected int drawUnselectedText(Graphics var1, int var2, int var3, int var4, int var5) throws BadLocationException {
- var1.setColor(this.unselected);
- Document var6 = ((View)this).getDocument();
- var6.getText(var4, var5 - var4, this.lineBuffer);
- return Utilities.drawTabbedText(this.lineBuffer, var2, var3, var1, this, var4);
- }
-
- protected final Segment getLineBuffer() {
- return this.lineBuffer;
- }
-
- private int getLineWidth(Element var1) {
- int var2 = var1.getStartOffset();
- int var3 = var1.getEndOffset();
-
- int var4;
- try {
- var1.getDocument().getText(var2, var3 - var2, this.lineBuffer);
- var4 = Utilities.getTabbedTextWidth(this.lineBuffer, this.metrics, this.tabBase, this, var2);
- } catch (BadLocationException var5) {
- var4 = 0;
- }
-
- return var4;
- }
-
- public float getPreferredSpan(int var1) {
- this.updateMetrics();
- switch (var1) {
- case 0:
- return (float)this.getLineWidth(this.longLine);
- case 1:
- return (float)(((View)this).getElement().getElementCount() * this.metrics.getHeight());
- default:
- throw new IllegalArgumentException("Invalid axis: " + var1);
- }
- }
-
- protected int getTabSize() {
- Integer var1 = (Integer)((View)this).getDocument().getProperty("tabSize");
- int var2 = var1 != null ? var1 : 8;
- return var2;
- }
-
- public void insertUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
- this.updateDamage(var1, var2, var3);
- }
-
- private Rectangle lineToRect(Shape var1, int var2) {
- Rectangle var3 = null;
- if (this.metrics != null) {
- Rectangle var4 = var1.getBounds();
- var3 = new Rectangle(var4.x, var4.y + var2 * this.metrics.getHeight(), var4.width, this.metrics.getHeight());
- }
-
- return var3;
- }
-
- public Shape modelToView(int var1, Shape var2, Position.Bias var3) throws BadLocationException {
- Document var4 = ((View)this).getDocument();
- Element var5 = ((View)this).getElement();
- int var6 = var5.getElementIndex(var1);
- Rectangle var7 = this.lineToRect(var2, var6);
- this.tabBase = var7.x;
- Element var8 = var5.getElement(var6);
- int var9 = var8.getStartOffset();
- var4.getText(var9, var1 - var9, this.lineBuffer);
- int var10 = Utilities.getTabbedTextWidth(this.lineBuffer, this.metrics, this.tabBase, this, var9);
- var7.x += var10;
- var7.width = 1;
- var7.height = this.metrics.getHeight();
- return var7;
- }
-
- public float nextTabStop(float var1, int var2) {
- if (this.tabSize == 0) {
- return var1;
- } else {
- int var3 = ((int)var1 - this.tabBase) / this.tabSize;
- return (float)(this.tabBase + (var3 + 1) * this.tabSize);
- }
- }
-
- public void paint(Graphics var1, Shape var2) {
- Shape var3 = var2;
- var2 = this.adjustPaintRegion(var2);
- Rectangle var4 = (Rectangle)var2;
- this.tabBase = var4.x;
- JTextComponent var5 = (JTextComponent)((View)this).getContainer();
- var1.setFont(((Component)var5).getFont());
- this.sel0 = var5.getSelectionStart();
- this.sel1 = var5.getSelectionEnd();
- this.unselected = ((Component)var5).isEnabled() ? ((Component)var5).getForeground() : var5.getDisabledTextColor();
- Caret var6 = var5.getCaret();
- this.selected = var6.isSelectionVisible() ? var5.getSelectedTextColor() : this.unselected;
- this.updateMetrics();
- Rectangle var7 = var1.getClipBounds();
- int var8 = this.metrics.getHeight();
- int var9 = var4.y + var4.height - (var7.y + var7.height);
- int var10 = Math.max(0, var9 / var8);
- int var11 = var7.y - var4.y;
- int var12 = Math.max(0, var11 / var8);
- int var13 = var4.height / var8;
- if (var4.height % var8 != 0) {
- ++var13;
- }
-
- Rectangle var14 = this.lineToRect(var2, var12);
- int var15 = var14.y + this.metrics.getAscent();
- int var16 = var14.x;
- Element var17 = ((View)this).getElement();
- int var18 = var17.getElementCount();
- int var19 = Math.min(var18, var13 - var10);
- --var18;
- Highlighter var20 = var5.getHighlighter();
- LayeredHighlighter var21 = var20 instanceof LayeredHighlighter ? (LayeredHighlighter)var20 : null;
-
- for(int var22 = var12; var22 < var19; ++var22) {
- if (var21 != null) {
- Element var23 = var17.getElement(var22);
- if (var22 == var18) {
- var21.paintLayeredHighlights(var1, var23.getStartOffset(), var23.getEndOffset(), var3, var5, this);
- } else {
- var21.paintLayeredHighlights(var1, var23.getStartOffset(), var23.getEndOffset() - 1, var3, var5, this);
- }
- }
-
- this.drawLine(var22, var1, var16, var15);
- var15 += var8;
- }
-
- }
-
- public void preferenceChanged(View var1, boolean var2, boolean var3) {
- ((View)this).getDocument().putProperty("lineLimit", (Object)null);
- super.preferenceChanged(var1, var2, var3);
- }
-
- public void removeUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
- this.updateDamage(var1, var2, var3);
- }
-
- void updateDamage(DocumentEvent var1, Shape var2, ViewFactory var3) {
- Container var4 = ((View)this).getContainer();
- if (((Component)var4).isShowing()) {
- this.updateMetrics();
- Element var5 = ((View)this).getElement();
- DocumentEvent.ElementChange var6 = var1.getChange(var5);
- Element[] var7 = var6 != null ? var6.getChildrenAdded() : null;
- Element[] var8 = var6 != null ? var6.getChildrenRemoved() : null;
- if (var7 != null && var7.length > 0 || var8 != null && var8.length > 0) {
- if (var7 != null) {
- int var13 = this.getLineWidth(this.longLine);
-
- for(int var15 = 0; var15 < var7.length; ++var15) {
- int var16 = this.getLineWidth(var7[var15]);
- if (var16 > var13) {
- var13 = var16;
- this.longLine = var7[var15];
- }
- }
- }
-
- if (var8 != null) {
- for(int var14 = 0; var14 < var8.length; ++var14) {
- if (var8[var14] == this.longLine) {
- this.calculateLongestLine();
- break;
- }
- }
- }
-
- this.preferenceChanged((View)null, true, true);
- ((Component)var4).repaint();
- } else {
- Element var9 = ((View)this).getElement();
- int var10 = var9.getElementIndex(var1.getOffset());
- this.damageLineRange(var10, var10, var2, var4);
- if (var1.getType() == EventType.INSERT) {
- int var11 = this.getLineWidth(this.longLine);
- Element var12 = var9.getElement(var10);
- if (var12 == this.longLine) {
- this.preferenceChanged((View)null, true, false);
- } else if (this.getLineWidth(var12) > var11) {
- this.longLine = var12;
- this.preferenceChanged((View)null, true, false);
- }
- } else if (var1.getType() == EventType.REMOVE && var9.getElement(var10) == this.longLine) {
- this.calculateLongestLine();
- this.preferenceChanged((View)null, true, false);
- }
- }
- }
-
- }
-
- final void updateMetrics() {
- Container var1 = ((View)this).getContainer();
- Font var2 = ((Component)var1).getFont();
- if (this.font != var2) {
- this.calculateLongestLine();
- this.tabSize = this.getTabSize() * this.metrics.charWidth('m');
- }
-
- }
-
- public int viewToModel(float var1, float var2, Shape var3, Position.Bias[] var4) {
- var4[0] = Bias.Forward;
- Rectangle var5 = var3.getBounds();
- Document var6 = ((View)this).getDocument();
- int var7 = (int)var1;
- int var8 = (int)var2;
- if (var8 < var5.y) {
- return ((View)this).getStartOffset();
- } else if (var8 > var5.y + var5.height) {
- return ((View)this).getEndOffset() - 1;
- } else {
- Element var9 = var6.getDefaultRootElement();
- int var10 = Math.abs((var8 - var5.y) / this.metrics.getHeight());
- if (var10 >= var9.getElementCount()) {
- return ((View)this).getEndOffset() - 1;
- } else {
- Element var11 = var9.getElement(var10);
- if (var7 < var5.x) {
- return var11.getStartOffset();
- } else if (var7 > var5.x + var5.width) {
- return var11.getEndOffset() - 1;
- } else {
- try {
- int var12 = var11.getStartOffset();
- int var13 = var11.getEndOffset() - 1;
- var6.getText(var12, var13 - var12, this.lineBuffer);
- this.tabBase = var5.x;
- int var14 = var12 + Utilities.getTabbedTextOffset(this.lineBuffer, this.metrics, this.tabBase, var7, this, var12);
- return var14;
- } catch (BadLocationException var15) {
- return -1;
- }
- }
- }
- }
- }
- }
-